// 文章实体  TypeORM是通过实体映射到数据库表
// 实体是一个映射到数据库表的类，你可以通过定义一个新类来创建一个实体，并用 @Entity 来标记
import { TagEntity } from './../tag/entities/tag.entity';
import { CategoryEntity } from './../category/entities/category.entity';
import { User } from 'src/user/entities/user.entity';
import {
  Column, // 生成实体属性的装饰器
  Entity, // Entity 是由 @Entity 装饰器装饰的模型， 将为此类模型在数据库创建数据库表
  JoinColumn, // 指定一对一关系的拥有者
  JoinTable, // 多对多关系拥有者必须指定的
  ManyToMany, // 多对多关系
  ManyToOne, // 多对一
  PrimaryGeneratedColumn, // 自动生成的主键列   PrimaryColumn--手动生成主键列
  RelationId,
} from 'typeorm';
import { Exclude } from 'class-transformer';
import { PostInfoDto } from './dto/post.dto';

@Entity('post')
export class PostsEntity {
  // 将 PostsEntity 模型作为实体类
  @PrimaryGeneratedColumn() // 创建一个主列，该值将使用自动增量值自动生成
  id: number; // 标记为主列，值自动生成

  // 文章标题
  @Column({ length: 50 }) // @Column 列类型
  title: string;

  // markdown内容
  @Column({ type: 'mediumtext', default: null })
  content: string;

  // markdown 转 html
  @Column({ type: 'mediumtext', default: null, name: 'content_html' }) // name 对于数据库表的名称
  contentHtml: string;

  // 摘要，自动生成
  @Column({ type: 'text', default: null })
  summary: string;

  // 封面图
  @Column({ default: null, name: 'cover_url' })
  coverUrl: string;

  // 阅读量
  @Column({ type: 'int', default: 0 })
  count: number;

  // 点赞量
  @Column({ type: 'int', default: 0, name: 'like_count' })
  likeCount: number;

  // 推荐显示
  @Column({ type: 'tinyint', default: 0, name: 'is_recommend' })
  isRecommend: number;

  // 文章状态
  @Column('simple-enum', { enum: ['draft', 'publish'] }) // enum: 枚举，数组已知的值
  status: string;

  // 作者
  @ManyToOne((type) => User, (user) => user.nickname) // @ManyToOne 多对一
  @JoinColumn({
    name:'anthorId'
  })
  author: User;
   
  // @RelationId( (user:User) => user.posts)
  // userId:User
  


  // 分类
  @Exclude()
  @ManyToOne(() => CategoryEntity, (category) => category.posts, {
    // cascade: true,
  })
  @JoinColumn({
    name: 'category_id',
  })
  category: CategoryEntity;


  // 标签
  @ManyToMany(() => TagEntity, (tag) => tag.posts)
  @JoinTable({
    name: 'post_tag',
    joinColumns: [{ name: 'post_id' }],
    inverseJoinColumns: [{ name: 'tag_id' }],
  })
  tags: TagEntity[];

  @Column({ type: 'timestamp', name: 'publish_time', default: null })
  publishTime: Date;

  @Column({ type: 'timestamp', name: 'create_time', default: null })
  createTime: Date;

  @Column({ type: 'timestamp', name: 'update_time', default: null })
  updateTime: Date;
  
  // 连表查询,转换
  toResponseObject(): PostInfoDto {
    let responseObj: PostInfoDto = {
      ...this,
      isRecommend: this.isRecommend ? true : false,
    };
    if (this.category) {
      responseObj.category = this.category.id;
    }
    if (this.tags && this.tags.length) {
      responseObj.tags = this.tags.map((item) => item.id);
    }
    // if (this.author || this.author.id) {
    //   responseObj.userId = this.author.id;
    //   responseObj.author = this.author.nickname || this.author.username;
    // }
    return responseObj;
  }
}
